package com.lj.demo.proxy;

import com.lj.demo.interceptor.Interceptor;
import com.lj.demo.invocation.Invocation;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Title: 代理处理类
 * Description:
 * Date: 2019年07月17日 16:53
 * @author lvjie@hiynn.com
 * @version 1.0
 * Significant Modify：
 * Date                  Author                 Content
 * =================================================================
 * 2019年07月17日         lvjie@hiynn.com         创建文件,实现基本功能
 * =================================================================
 */
public class ProxyBean implements InvocationHandler {

    private Object target = null;

    private Interceptor interceptor = null;

    /**
     * 获取代理对象
     * @param target 目标对象
     * @param interceptor 拦截器
     * @return 代理对象
     */
    public static Object getNewPoxyInstance(Object target, Interceptor interceptor){
        ProxyBean proxyBean = new ProxyBean();
        proxyBean.target = target;
        proxyBean.interceptor = interceptor;
        Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), proxyBean);
        return proxy;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Invocation invocation = new Invocation(target,args,method);
        Object result = null;
        try {
            // 1、执行before方法
            if (this.interceptor.before()){
                //判断是否需要替代目标对象的执行方法
                if (this.interceptor.isUseAround()){
                    //替代目标对象的执行方法
                    result = this.interceptor.around(invocation);
                }else {
                    //执行目标对象原有的方法
                    result = invocation.proceed();
                }
                //执行after方法
                this.interceptor.after();
            }
        }catch (Exception e){
            e.printStackTrace();
            //抛出异常执行afterThrowing方法
            this.interceptor.afterThrowing();
            return result;
        }
        //正常执行afterReturn方法
        this.interceptor.afterReturn();
        return result;
    }
}
